﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace AngryNurdz
{
    public class BasicShape
    {
        public Vector3 shapeSize;
        public Vector3 shapePosition;
        private VertexPositionNormalTexture[][] shapeVertices;
        private int shapeTriangles;
        private VertexBuffer shapeBuffer;
        public Texture2D topTexture;
        public Texture2D frontTexture;
        public Texture2D backTexture;
        public Texture2D leftTexture;
        public Texture2D rightTexture;
        public Texture2D bottomTexture;

        public BasicShape(Vector3 size, Vector3 position)
        {
            shapeSize = size;
            shapePosition = position;
        }

        private void BuildShape()
        {
            shapeTriangles = 12;

            shapeVertices = new VertexPositionNormalTexture[6][];
            for (int i = 0; i < 6; i++)
            {
                shapeVertices[i] = new VertexPositionNormalTexture[6];
            }

            Vector3 topLeftFront = shapePosition +
             new Vector3(0.0f, 1.0f, 0.0f) * shapeSize;
            Vector3 bottomLeftFront = shapePosition +
             new Vector3(0.0f, 0.0f, 0.0f) * shapeSize;
            Vector3 topRightFront = shapePosition +
             new Vector3(1.0f, 1.0f, 0.0f) * shapeSize;
            Vector3 bottomRightFront = shapePosition +
             new Vector3(1.0f, 0.0f, 0.0f) * shapeSize;
            Vector3 topLeftBack = shapePosition +
             new Vector3(0.0f, 1.0f, 1.0f) * shapeSize;
            Vector3 topRightBack = shapePosition +
             new Vector3(1.0f, 1.0f, 1.0f) * shapeSize;
            Vector3 bottomLeftBack = shapePosition +
             new Vector3(0.0f, 0.0f, 1.0f) * shapeSize;
            Vector3 bottomRightBack = shapePosition +
             new Vector3(1.0f, 0.0f, 1.0f) * shapeSize;

            Vector3 topLeftFront2 = shapePosition +
             new Vector3(0.0f, 1.0f, 0.0f) * shapeSize;
            Vector3 bottomLeftFront2 = shapePosition +
             new Vector3(0.0f, 0.0f, 0.0f) * shapeSize;
            Vector3 topRightFront2 = shapePosition +
             new Vector3(1.0f, 1.0f, 0.0f) * shapeSize;
            Vector3 bottomRightFront2 = shapePosition +
             new Vector3(1.0f, 0.0f, 0.0f) * shapeSize;
            Vector3 topLeftBack2 = shapePosition +
             new Vector3(0.0f, 1.0f, 1.0f) * shapeSize;
            Vector3 topRightBack2 = shapePosition +
             new Vector3(1.0f, 1.0f, 1.0f) * shapeSize;
            Vector3 bottomLeftBack2 = shapePosition +
             new Vector3(0.0f, 0.0f, 1.0f) * shapeSize;
            Vector3 bottomRightBack2 = shapePosition +
             new Vector3(1.0f, 0.0f, 1.0f) * shapeSize;

            Vector3 topLeftFront3 = shapePosition +
             new Vector3(0.0f, 1.0f, 0.0f) * shapeSize;
            Vector3 bottomLeftFront3 = shapePosition +
             new Vector3(0.0f, 0.0f, 0.0f) * shapeSize;
            Vector3 topRightFront3 = shapePosition +
             new Vector3(1.0f, 1.0f, 0.0f) * shapeSize;
            Vector3 bottomRightFront3 = shapePosition +
             new Vector3(1.0f, 0.0f, 0.0f) * shapeSize;
            Vector3 topLeftBack3 = shapePosition +
             new Vector3(0.0f, 1.0f, 1.0f) * shapeSize;
            Vector3 topRightBack3 = shapePosition +
             new Vector3(1.0f, 1.0f, 1.0f) * shapeSize;
            Vector3 bottomLeftBack3 = shapePosition +
             new Vector3(0.0f, 0.0f, 1.0f) * shapeSize;
            Vector3 bottomRightBack3 = shapePosition +
             new Vector3(1.0f, 0.0f, 1.0f) * shapeSize;

            Vector3 frontNormal = new Vector3(0.0f, 0.0f, 1.0f) * shapeSize;
            Vector3 backNormal = new Vector3(0.0f, 0.0f, -1.0f) * shapeSize;
            Vector3 topNormal = new Vector3(0.0f, 1.0f, 0.0f) * shapeSize;
            Vector3 bottomNormal = new Vector3(0.0f, -1.0f, 0.0f) * shapeSize;
            Vector3 leftNormal = new Vector3(-1.0f, 0.0f, 0.0f) * shapeSize;
            Vector3 rightNormal = new Vector3(1.0f, 0.0f, 0.0f) * shapeSize;

            Vector2 textureTopLeft = new Vector2(1f * shapeSize.X, 0.0f * shapeSize.Y);
            Vector2 textureTopRight = new Vector2(0.0f * shapeSize.X, 0.0f * shapeSize.Y);
            Vector2 textureBottomLeft = new Vector2(1f * shapeSize.X, 1f * shapeSize.Y);
            Vector2 textureBottomRight = new Vector2(0.0f * shapeSize.X, 1f * shapeSize.Y);

            // Front face.
            shapeVertices[0][0] = new VertexPositionNormalTexture(
             topLeftFront, frontNormal, textureTopLeft);
            shapeVertices[0][1] = new VertexPositionNormalTexture(
             bottomLeftFront, frontNormal, textureBottomLeft);
            shapeVertices[0][2] = new VertexPositionNormalTexture(
             topRightFront, frontNormal, textureTopRight);
            shapeVertices[0][3] = new VertexPositionNormalTexture(
             bottomLeftFront, frontNormal, textureBottomLeft);
            shapeVertices[0][4] = new VertexPositionNormalTexture(
             bottomRightFront, frontNormal, textureBottomRight);
            shapeVertices[0][5] = new VertexPositionNormalTexture(
             topRightFront, frontNormal, textureTopRight);

            // Back face.
            shapeVertices[1][0] = new VertexPositionNormalTexture(
             topLeftBack, backNormal, textureTopRight);
            shapeVertices[1][1] = new VertexPositionNormalTexture(
             topRightBack, backNormal, textureTopLeft);
            shapeVertices[1][2] = new VertexPositionNormalTexture(
             bottomLeftBack, backNormal, textureBottomRight);
            shapeVertices[1][3] = new VertexPositionNormalTexture(
             bottomLeftBack, backNormal, textureBottomRight);
            shapeVertices[1][4] = new VertexPositionNormalTexture(
             topRightBack, backNormal, textureTopLeft);
            shapeVertices[1][5] = new VertexPositionNormalTexture(
             bottomRightBack, backNormal, textureBottomLeft);

            // Top face.
            shapeVertices[2][0] = new VertexPositionNormalTexture(
             topLeftFront2, topNormal, textureBottomLeft);
            shapeVertices[2][1] = new VertexPositionNormalTexture(
             topRightBack2, topNormal, textureTopRight);
            shapeVertices[2][2] = new VertexPositionNormalTexture(
             topLeftBack2, topNormal, textureTopLeft);
            shapeVertices[2][3] = new VertexPositionNormalTexture(
             topLeftFront2, topNormal, textureBottomLeft);
            shapeVertices[2][4] = new VertexPositionNormalTexture(
             topRightFront2, topNormal, textureBottomRight);
            shapeVertices[2][5] = new VertexPositionNormalTexture(
             topRightBack2, topNormal, textureTopRight);

            // Bottom face.
            shapeVertices[3][0] = new VertexPositionNormalTexture(
             bottomLeftFront2, bottomNormal, textureTopLeft);
            shapeVertices[3][1] = new VertexPositionNormalTexture(
             bottomLeftBack2, bottomNormal, textureBottomLeft);
            shapeVertices[3][2] = new VertexPositionNormalTexture(
             bottomRightBack2, bottomNormal, textureBottomRight);
            shapeVertices[3][3] = new VertexPositionNormalTexture(
             bottomLeftFront2, bottomNormal, textureTopLeft);
            shapeVertices[3][4] = new VertexPositionNormalTexture(
             bottomRightBack2, bottomNormal, textureBottomRight);
            shapeVertices[3][5] = new VertexPositionNormalTexture(
             bottomRightFront2, bottomNormal, textureTopRight);

            // Left face.
            shapeVertices[4][0] = new VertexPositionNormalTexture(
             topLeftFront3, leftNormal, textureTopRight);
            shapeVertices[4][1] = new VertexPositionNormalTexture(
             bottomLeftBack3, leftNormal, textureBottomLeft);
            shapeVertices[4][2] = new VertexPositionNormalTexture(
             bottomLeftFront3, leftNormal, textureBottomRight);
            shapeVertices[4][3] = new VertexPositionNormalTexture(
             topLeftBack3, leftNormal, textureTopLeft);
            shapeVertices[4][4] = new VertexPositionNormalTexture(
             bottomLeftBack3, leftNormal, textureBottomLeft);
            shapeVertices[4][5] = new VertexPositionNormalTexture(
             topLeftFront3, leftNormal, textureTopRight);

            // Right face.
            shapeVertices[5][0] = new VertexPositionNormalTexture(
             topRightFront3, rightNormal, textureTopLeft);
            shapeVertices[5][1] = new VertexPositionNormalTexture(
             bottomRightFront3, rightNormal, textureBottomLeft);
            shapeVertices[5][2] = new VertexPositionNormalTexture(
             bottomRightBack3, rightNormal, textureBottomRight);
            shapeVertices[5][3] = new VertexPositionNormalTexture(
             topRightBack3, rightNormal, textureTopRight);
            shapeVertices[5][4] = new VertexPositionNormalTexture(
             topRightFront3, rightNormal, textureTopLeft);
            shapeVertices[5][5] = new VertexPositionNormalTexture(
             bottomRightBack3, rightNormal, textureBottomRight);
        }

        public void SetTopTexture(Texture2D tex)
        {
            topTexture = tex;
        }
        public void SetSideTexture(Texture2D tex)
        {
            frontTexture = tex;
            backTexture = tex;
            leftTexture = tex;
            rightTexture = tex;
        }
        public void SetBottomTexture(Texture2D tex)
        {
            bottomTexture = tex;
        }

        public void RenderShape(GraphicsDevice device, Effect effect)
        {
            BuildShape();

            foreach (EffectPass pass in effect.CurrentTechnique.Passes)
            {
                effect.Parameters["Texture"].SetValue(topTexture);
                pass.Apply();
                device.DrawUserPrimitives(PrimitiveType.TriangleList, shapeVertices[2], 0, 2);

                effect.Parameters["Texture"].SetValue(bottomTexture);
                pass.Apply();
                device.DrawUserPrimitives(PrimitiveType.TriangleList, shapeVertices[3], 0, 2);

                effect.Parameters["Texture"].SetValue(frontTexture);
                pass.Apply();
                device.DrawUserPrimitives(PrimitiveType.TriangleList, shapeVertices[0], 0, 2);

                effect.Parameters["Texture"].SetValue(backTexture);
                pass.Apply();
                device.DrawUserPrimitives(PrimitiveType.TriangleList, shapeVertices[1], 0, 2);

                effect.Parameters["Texture"].SetValue(leftTexture);
                pass.Apply();
                device.DrawUserPrimitives(PrimitiveType.TriangleList, shapeVertices[4], 0, 2);

                effect.Parameters["Texture"].SetValue(rightTexture);
                pass.Apply();
                device.DrawUserPrimitives(PrimitiveType.TriangleList, shapeVertices[5], 0, 2);
            }

        }
    }
}
